<?php
/**
 * 数据库
 *
 * @copyright  Copyright (c) 2006 - 2010 Movoin Studio <http://www.movoin.com>
 * @license    GNU General Public License 2.0 {@link http://www.gnu.org/licenses/gpl-2.0.html}
 * @package    Db
 * @category   Moca
 * @author     Allen <movoin@gmail.com>
 * @version    $Id: Db.php 4 2010-06-02 03:08:52Z movoin $
 **/

class Moca_Db
{
    /** 升序方式 */
    const SORT_ASC = 'ASC';

    /** 降序方式 */
    const SORT_DESC = 'DESC';

    /** 表内连接方式 */
    const INNER_JOIN = 'INNER';

    /** 表外连接方式 */
    const OUTER_JOIN = 'OUTER';

    /** 表左连接方式 */
    const LEFT_JOIN = 'LEFT';

    /** 表外连接方式 */
    const RIGHT_JOIN = 'RIGHT';

    /** 数据库查询操作 */
    const SELECT = 'SELECT';

    /** 数据库更新操作 */
    const UPDATE = 'UPDATE';

    /** 数据库插入操作 */
    const INSERT = 'INSERT';

    /** 数据库删除操作 */
    const DELETE = 'DELETE';

    /**
     * 数据库适配器
     * @var Moca_Db_Adapter
     */
    private $_adapter;

    /**
     * 默认配置
     *
     * @access private
     * @var Moca_Config
     */
    private $_config;

    /**
     * 适配器名称
     *
     * @access private
     * @var string
     */
    private $_adapterName;

    /**
     * 实例化的数据库对象
     * @var Moca_Db
     */
    private static $_instance;

    /**
     * 构造函数
     * 
     * @param array $config 数据库连接参数
     * @param string $adapter 适配器名称
     * @access private
     * @return void
     */
    private function __construct($config, $adapter)
    {
        /**
         * 写入配置
         */
        $this->_config = Moca_Config::factory($config);

        /**
         * 数据库适配器
         */
        $this->_adapterName = $adapter;
        $adapterName = 'Moca_Db_Adapter_' . $adapter;

        /**
         * 载入适配器
         */
        Moca_Common::loadFile($adapterName);

        /**
         * 实例化数据库适配器
         */
        $this->_adapter = new $adapterName();
    }

    /**
     * 以工厂方式构造一个数据库对象实例
     * 
     * @param array $config 数据库连接参数
     * @param string $adapter 数据库适配器名称
     * @access public
     * @return void
     */
    static function factory($config, $adapter = 'Mysql')
    {
        return new Moca_Db($config, $adapter);
    }

    /**
     * 获得表前缀
     * 
     * @access public
     * @return string
     */
    function getPrefix()
    {
        return $this->_config->prefix;
    }

    /**
     * 获得数据库适配器名称
     * 
     * @access public
     * @return string
     */
    function getAdapterName()
    {
        return $this->_adapterName;
    }

    /**
     * 设置数据库对象实例
     *
     * @param Moca_Db $dbo 
     * @access public
     */
    function setDBO(Moca_Db $dbo)
    {
        self::$_instance = $dbo;
    }

    /**
     * 获得数据库对象实例
     *
     * @access public
     * @return Moca_Db
     */
    function getDBO()
    {
        if (empty(self::$_instance)) {
            // @TODO 异常处理
            die('Not set Database Object instance!');
        }
        return self::$_instance;
    }
}

